#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve()
{
    ll n, m,sum=0;
    cin >> n >> m;
    vector<ll> a(n+1),b(n+1);
    for (ll i = 1; i <= n; i++)
    {
        cin >> a[i] >> b[i];
    }
    for (int i = 1; i <= n; ++i)
    {
        int ti;
        if (i == 1)
        {
            ti = a[i];
            if (ti % 2 == 0 && b[i] == 0)
            {
                sum += ti;
            }
            else if (ti % 2 == 1 && b[i] == 1)
            {
                sum += ti;
            }
            else
            {
                sum += ti - 1;
            }
        }
        else
        {
            ti = a[i] - a[i - 1];
            if (ti % 2 == 0 && b[i] == b[i - 1])
            {
                sum += ti;
            }
            else if (ti % 2 == 1 && b[i] != b[i - 1])
            {
                sum += ti;
            }
            else
            {
                sum += ti - 1;
            }
        }
    }
    if (a[n] < m)
        sum += (m - a[n]);
    cout << sum << endl;
}
int main()
{
    ll t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
}
/*翻译有点抽象，但大体就是要求在a时刻要抵达b位置的同时，保证跑的次数最多。

因为只有两端，所以可以通过间隔时间的奇偶性来计算。当间隔时间为奇数时，若当前位置与目标位置相同，则每一秒都可以跑，即能得到最大的分数；当间隔时间为偶数时，若当前位置与目标位置不同，则每一秒都可以跑，即能得到最大的分数。否则，均需要有一秒原地不动，剩余时间再跑。

对于第一次跑，起始位置为0；对于最后一次跑，若剩余还有时间，则都可以用来跑。*/